package fr.miage.course7.app.workdata;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Classe gérant la communication avec le serveur.
 * @author Jonathan LAMOTTE
 *
 */
public class Client {

    /**
     * Socket de communication avec le serveur.
     */
    private Socket socket = null;

    /**
     * Buffer d'ecriture.
     */
    private PrintWriter out;

    /**
     * Buffer de lecture.
     */
    private BufferedReader in;

    /**
     * Adresse de communication.
     */
    private final String ip = "127.0.0.1";

    /**
     * Port de communication.
     */
    private final int port = 5000;

    /**
     * Classe client.
     */
    public Client() {
        try {

            System.out.println("Demande de connexion");
            socket = new Socket(ip, port);

            // Si le message s'affiche c'est que je suis connecté
            System.out.println("Connexion établie avec le serveur");

            out = new PrintWriter(socket.getOutputStream());
            in = new BufferedReader(
                    new InputStreamReader(
                            socket.getInputStream()
                    )
                );

            System.out.println("Recuperation de la liste des bateaux :");

            // Initialisation des variables
            XMLReader.parseListeBateaux(getListeBateaux());

            Thread t = new Thread(new Reception(socket));
            t.start();

        } catch (UnknownHostException e) {
          System.err.println("Impossible de se connecter à l'adresse "
                  + socket.getLocalAddress());

        } catch (IOException e) {
          System.err.println("Aucun serveur à l'écoute du port 5000");
        }
    }

    /**
     * Fonction d'envoi d'une chaine de caractère.
     * @param message : message a envoyer
     */
    public final synchronized void envoi(final String message) {
        out.println(message);
        out.flush();
    }

    /**
     * Envoie un message de demande de mise a jour.
     * @return message de mise a jour
     */
    public final synchronized String update() {
        String message = "";

        envoi("[UPDATE]");

        try {
            message = in.readLine();
        } catch (IOException e) {
            System.err.println("Perte de la connection avec le serveur");
        }

        return message;
    }

    /**
     * Recuperation de la liste des bateaux avec leurs transmissions.
     * @return une chaine GPX
     */
    public final String getListeBateaux() {
        String message = "";

        envoi("[INIT]");

        try {
            message = in.readLine();
        } catch (IOException e) {
            System.err.println("Perte de la connection avec le serveur");
        }

        return message;
    }

    /**
     * Recuperation de la dernière transmission du bateau id.
     * @param id : identifiant du bateau
     * @return la dernière transmission
     */
    public final String getLastTransmission(final int id) {
        String message = "";

        envoi("[TRANSMISSION]" + id);

        try {
            message = in.readLine();
        } catch (IOException e) {
            System.err.println("Perte de la connection avec le serveur");
        }

        return message;

    }
}
